#ifndef ___fat32_operacionAW_buscar_entrada_en_sector

#define ___fat32_operacionAW_buscar_entrada_en_sector 1

#include "f32_mto.c"

struct fat32opAW_datos_busqueda {
  char * buffer;
  char * nombre;
};

unsigned char fat32op_buscar_entrada_en_sector(FAT32_PARAMS_OPERACION);
unsigned char fat32aop_comparar_nombres_cortos_entrada(char *, char *);
unsigned short int * fat32aop_obtener_nombre_largo_entrada(char *);

unsigned char fat32op_buscar_entrada_en_sector (FAT32_PARAMS_OPERACION) {
  struct fat32opAW_datos_busqueda * datos = datosEntrada;
  unsigned char numeroEntrada;
  char * entradaDir;
  unsigned short int * nombreLargo;
  unsigned short int * nombreBuscado;
  int resultado;
  for (numeroEntrada = 0; numeroEntrada < 16; numeroEntrada ++) {
    entradaDir = buffer + 1024 + 32 * numeroEntrada;
    if (!*entradaDir) return 18;
    if (*entradaDir == 229) continue;
    if (entradaDir[11] & 8) continue;
    if (fat32aop_comparar_nombres_cortos_entrada(entradaDir, datos -> nombre)) break;
    nombreLargo = fat32aop_obtener_nombre_largo_entrada(entradaDir);
    if (!nombreLargo) continue;
    nombreBuscado = fat32_convertir_utf8_a_utf16(datos -> nombre);
    if (nombreBuscado) resultado = strcmp16(nombreLargo, nombreBuscado); else resultado = 1;
    free(nombreLargo);
    if (nombreBuscado) free(nombreBuscado);
    if (!resultado) break;
  }
  return numeroEntrada + 1;
}

unsigned char fat32aop_comparar_nombres_cortos_entrada (char * entradaDirectorio, char * nombre) {
  char nombre1[22];
  char nombre2[22];
  unsigned char pos, p1, p2;
  char c1, c2, c3;
  if (strlen(nombre) > 21) return 0;
  for (pos = 0; pos < strlen(nombre); pos ++) {
    nombre2[pos] = nombre[pos];
    if ((nombre2[pos] > 96) && (nombre2[pos] <= 122)) nombre2[pos] -= 32;
  }
  nombre2[pos] = 0;
  for (pos = 0, p1 = 0; pos < 11; pos ++, p1 ++) {
    c1 = entradaDirectorio[pos];
    if (!pos && (c1 == 5)) c1 = 229;
    if (c1 < 128)
      nombre1[p1] = c1;
    else {
      c2 = 128 + c1 & 63;
      c3 = 192 + c1 / 64;
      nombre1[p1] = c3;
      p1 ++;
      nombre1[p1] = c2;
    }
    if (pos < 7) {
      for (p2 = pos + 1; p2 < 8; p2 ++) if (entradaDirectorio[pos] != 32) break;
      if (p2 == 8) pos = 7;
    }
    if (pos == 7) {
      p1 ++;
      nombre1[p1] = '.';
    }
    if ((pos == 8) && (entradaDirectorio[8] == 32)) {
      p1 -= 2;
      pos = 11;
    }
    if ((pos >= 8) && (pos < 11)) {
      for (p2 = pos + 1; p2 < 11; p2 ++) if (entradaDirectorio[pos] != 32) break;
      if (p2 == 11) pos = 11;
    }
  }
  nombre1[p1] = 0;
  return !strcmp(nombre1, nombre2);
}

unsigned short int * fat32aop_obtener_nombre_largo_entrada (char * entradaDirectorio) {
  unsigned char checksum = 0;
  unsigned char posicion;
  for (posicion = 0; posicion < 11; posicion ++) {
    checksum = ((checksum & 1) * 128) + (checksum / 2);
    checksum += entradaDirectorio[posicion];
  }
  char * entradaActual;
  unsigned short int * cadenaActual = malloc(260 * sizeof(unsigned short int));
  unsigned short int posCadena = 0;
  unsigned short int caracter;
  unsigned char posicion;
  unsigned char posEntrada;
  entradaActual = entradaDirectorio;
  unsigned char nombreTermino = 0;
  unsigned char numeroEntrada = 0;
  unsigned char ultimaEntrada = 0;
  while (!nombreTermino) {
    entradaActual -= 32;
    if (!*entradaActual || (*entradaActual > 127) || (*entradaActual == 64)) nombreTermino = 1;
    if ((entradaActual[11] & 63) != 15) nombreTermino = 1;
    if (entradaActual[12]) nombreTermino = 1;
    if (entradaActual[13] != checksum) nombreTermino = 1;
    if (entradaActual[26] || entradaActual[27]) nombreTermino = 1;
    ultimaEntrada = *entradaActual & 64;
    numeroEntrada ++;
    if (numeroEntrada != (*entradaActual & 63)) nombreTermino = 1;
    if (numeroEntrada > 20) nombreTermino = 1;
    for (posicion = 0; !nombreTermino && (posicion < 13); posicion ++) {
      posEntrada = posicion * 2 + 1;
      if (posicion >= 5) posEntrada += 3;
      if (posicion >= 11) posEntrada += 2;
      caracter = fb_convertir_de_little_endian(entradaActual + posicion, 16);
      if (caracter) cadenaActual[posCadena ++] = caracter; else nombreTermino = 1;
    }
  }
  if (!posCadena) {
    free(cadenaActual);
    return NULL;
  }
  else {
    cadenaActual[posCadena] = 0;
    return cadenaActual;
  }
}

#endif